<template><div><h2 id="什么是rabbitmq-有什么显著的特点" tabindex="-1"><a class="header-anchor" href="#什么是rabbitmq-有什么显著的特点"><span>什么是RabbitMQ？有什么显著的特点？</span></a></h2>
<p>RabbitMQ是一个开源的消息中间件，使用<code v-pre>Erlang</code>语言开发。这种语言天生非常适合分布式场景，RabbitMQ也就非常适用于分布式应用程序之间传递消息。</p>
<ol>
<li><strong>消息传递模式</strong></li>
<li><strong>消息路由和交换机</strong></li>
<li><strong>消息确认机制</strong></li>
<li><strong>可扩展性</strong></li>
<li><strong>多种编程语言支持</strong></li>
<li><strong>消息持久性</strong></li>
<li><strong>灵活的插件系统</strong></li>
<li><strong>管理界面</strong></li>
</ol>
<h2 id="rabbitmq和amqp是什么关系" tabindex="-1"><a class="header-anchor" href="#rabbitmq和amqp是什么关系"><span>RabbitMQ和AMQP是什么关系？</span></a></h2>
<ul>
<li>AMQP：AMQP是一个协议规范，它是一个开放的消息产地协议，是一种应用层的标准协议，为面向消息的中间件设计。</li>
<li>RabbitMQ：RabbitMQ使用AMQP协议来实现消息传递的标准，但也支持其他消息传递协议，如STOMP和MQTT协议等。</li>
</ul>
<h2 id="rabbitmq的核心组件有哪些" tabindex="-1"><a class="header-anchor" href="#rabbitmq的核心组件有哪些"><span>RabbitMQ的核心组件有哪些？</span></a></h2>
<ol>
<li><strong>Broker</strong></li>
<li><strong>Virtual Host</strong></li>
<li><strong>Connection连接诶</strong></li>
<li><strong>Channel通道</strong></li>
<li><strong>Exchange交换机</strong></li>
<li><strong>Queue队列</strong></li>
<li><strong>Bingding绑定关系</strong></li>
</ol>
<h2 id="rabbitmq如何构建集群" tabindex="-1"><a class="header-anchor" href="#rabbitmq如何构建集群"><span>RabbitMQ如何构建集群？</span></a></h2>
<ol>
<li><strong>普通集群</strong></li>
<li><strong>镜像集群</strong></li>
</ol>
<h2 id="rabbitmq中有哪几种交换机类型" tabindex="-1"><a class="header-anchor" href="#rabbitmq中有哪几种交换机类型"><span>RabbitMQ中有哪几种交换机类型？</span></a></h2>
<ol>
<li><strong>Direct Exchange（路由键匹配）</strong></li>
<li><strong>Topic Exchange（主题匹配）</strong></li>
<li><strong>Headers Exchange（消息标头匹配）</strong></li>
<li><strong>Fanout Exchange</strong></li>
<li><strong>Default Exchange</strong></li>
</ol>
<h2 id="rabbitmq支持那些消息模式" tabindex="-1"><a class="header-anchor" href="#rabbitmq支持那些消息模式"><span>RabbitMQ支持那些消息模式？</span></a></h2>
<ol>
<li><strong>WorkQueue工作序列机制</strong></li>
<li><strong>Publish/Subscribe订阅发布机制</strong></li>
<li><strong>Routing基于内容路由机制</strong></li>
<li><strong>Topic基于话题路由机制</strong></li>
</ol>
<h2 id="rabbitmq如何实现消息的持久化" tabindex="-1"><a class="header-anchor" href="#rabbitmq如何实现消息的持久化"><span>RabbitMQ如何实现消息的持久化？</span></a></h2>
<ol>
<li><strong>消息持久化</strong></li>
<li><strong>队列持久化</strong></li>
<li><strong>交换机持久化</strong></li>
</ol>
<h2 id="rabbitmq是如何实现死信队列的" tabindex="-1"><a class="header-anchor" href="#rabbitmq是如何实现死信队列的"><span>RabbitMQ是如何实现死信队列的？</span></a></h2>
<p>死信队列是RabbitMQ提供的一种特殊序列，处理那些无法被正常消费的消息。有三种情况会产生死信：</p>
<ul>
<li>消息被消费者明确拒绝。</li>
<li>消息达到预设的过期时间仍没有被消费者消费。</li>
<li>消息由于队列已经达到最大长度限制而被丢弃。</li>
</ul>
<p>在RabbitMQ中，实现死信队列只需要给正常队列增加三个核心参数即可：</p>
<ol>
<li>dead-letter-exchange：指定当前队列对应的死信队列。</li>
<li>dead-letter-routing-key：指定消息转入死信队列时的路由键。</li>
<li>message-ttl：消息在队列中的过期时间。</li>
</ol>
<h2 id="rabbitmq中如何进行事务处理" tabindex="-1"><a class="header-anchor" href="#rabbitmq中如何进行事务处理"><span>RabbitMQ中如何进行事务处理？</span></a></h2>
<ol>
<li><strong>开启事务</strong></li>
<li><strong>发送消息</strong></li>
<li><strong>提交事务</strong></li>
<li><strong>处理异常</strong></li>
</ol>
<h2 id="说说常用的rabbitmq插件" tabindex="-1"><a class="header-anchor" href="#说说常用的rabbitmq插件"><span>说说常用的RabbitMQ插件</span></a></h2>
<ol>
<li>Management Plugin：Web管理页面插件。</li>
<li>Shovel Plugin：将消息从RabbitMQ服务器传递到另一个RabbitMQ服务器，实现消息复制和跨集群通信。</li>
<li>Federation Plugin：允许不同RabbitMQ集群之间建立联合，实现消息的跨集群传递。</li>
<li>STOMP Plugin：允许使用STOMP协议与RabbitMQ通信。</li>
<li>Prometheus Plugin：将RabbitMQ的性能指标导出到Prometheus监控系统，以便进行性能监控和警报。</li>
<li>Delayed Message Plugin：延迟队列插件，对于实现定时任务、延迟重试等场景非常有用。</li>
</ol>
<h2 id="rabbitmq的消息丢失、消息消费顺序、消息重复消费问题怎么解决" tabindex="-1"><a class="header-anchor" href="#rabbitmq的消息丢失、消息消费顺序、消息重复消费问题怎么解决"><span>RabbitMQ的消息丢失、消息消费顺序、消息重复消费问题怎么解决</span></a></h2>
<h4 id="消息丢失-如何保证消息的可靠性" tabindex="-1"><a class="header-anchor" href="#消息丢失-如何保证消息的可靠性"><span>消息丢失/如何保证消息的可靠性</span></a></h4>
<p>消息丢失有三种情况：消息到MQ的过程中丢失、MQ丢失、MQ到消费过程丢失、
生产者到RabbitMQ:事务机制、发布确认机制。（二者互斥，不可共存）
RabbitMQ自身：持久化、集群、普通模式、镜像模式。
RabbitMQ到消费者：消息应答机制、死信队列、消息补偿机制。</p>
<h4 id="消息消费顺序-如何保证消息的消费顺序" tabindex="-1"><a class="header-anchor" href="#消息消费顺序-如何保证消息的消费顺序"><span>消息消费顺序？如何保证消息的消费顺序</span></a></h4>
<ul>
<li>拆分多个消息队列，每个消息队列一个消费者。</li>
<li>一个队列对应一个消费者，然后消费者内部用内存队列做排队，然后分发给底层不同的worker来处理。</li>
</ul>
<h3 id="消息重复消费-幂等性" tabindex="-1"><a class="header-anchor" href="#消息重复消费-幂等性"><span>消息重复消费（幂等性）</span></a></h3>
<ul>
<li>给每个消费加上一个全局唯一标识id。存储到redis等缓存中（setnx）。</li>
</ul>
</div></template>


